package com.data.monitoring.utils;

import com.jcraft.jsch.*;

import java.util.*;
import java.text.SimpleDateFormat;

public class RemoteFolderChecker {

    /**
     * 查询远程服务器指定路径下最新的文件夹
     * @param host 服务器IP
     * @param port SSH端口（默认22）
     * @param username 用户名
     * @param password 密码
     * @param remotePath 要查询的远程路径
     * @return Map包含最新文件夹的名称和修改时间，失败返回null
     */
    public static Map<String, String> getLatestFolderInfo(
            String host, int port, String username, 
            String password, String remotePath) {
        
        Session session = null;
        ChannelSftp channel = null;
        
        try {
            // 1. 创建JSch并配置会话
            JSch jsch = new JSch();
            session = jsch.getSession(username, host, port);
            session.setPassword(password);
            
            // 避免首次连接时的known_hosts检查
            Properties config = new Properties();
            config.put("StrictHostKeyChecking", "no");
            session.setConfig(config);
            
            session.connect();
            
            // 2. 创建SFTP通道
            channel = (ChannelSftp) session.openChannel("sftp");
            channel.connect();
            
            // 3. 切换到目标目录
            channel.cd(remotePath);
            
            // 4. 列出所有文件和文件夹
            Vector<ChannelSftp.LsEntry> list = channel.ls(".");
            
            // 5. 筛选文件夹并找出最新的
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Map<String, Long> folderMtimeMap = new HashMap<>();
            
            for (ChannelSftp.LsEntry entry : list) {
                if (entry.getAttrs().isDir() && 
                    !entry.getFilename().equals(".") && 
                    !entry.getFilename().equals("..")) {
                    
                    // 获取修改时间（Unix时间戳）
                    long mtime = entry.getAttrs().getMTime() * 1000L;
                    folderMtimeMap.put(entry.getFilename(), mtime);
                }
            }
            
            if (folderMtimeMap.isEmpty()) {
                System.out.println("目标路径下没有文件夹");
                return null;
            }
            
            // 找出最新修改的文件夹
            Map.Entry<String, Long> latestEntry = Collections.max(
                folderMtimeMap.entrySet(), 
                Map.Entry.comparingByValue()
            );
            
            // 6. 返回结果
            Map<String, String> result = new HashMap<>();
            result.put("name", latestEntry.getKey());
            result.put("modifyTime", sdf.format(new Date(latestEntry.getValue())));
            
            return result;
            
        } catch (JSchException e) {
            System.err.println("SSH连接失败: " + e.getMessage());
        } catch (SftpException e) {
            System.err.println("SFTP操作失败: " + e.getMessage());
        } finally {
            if (channel != null) channel.disconnect();
            if (session != null) session.disconnect();
        }
        
        return null;
    }

    // 使用示例
    public static void main(String[] args) {
        Map<String, String> latestFolder = getLatestFolderInfo(
            "192.168.1.100",  // 服务器IP
            22,               // SSH端口
            "admin",          // 用户名
            "password123",    // 密码
            "/home/logs"      // 要查询的路径
        );
        
        if (latestFolder != null) {
            System.out.println("最新文件夹: " + latestFolder.get("name"));
            System.out.println("修改时间: " + latestFolder.get("modifyTime"));
        }
    }
}